package com.allen.study.infrastructure.persistence;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.allen.study.application.api.request.SysRoleQueryRequest;
import com.allen.study.application.api.response.SysRoleQueryResponse;
import com.allen.study.application.repository.ISysRoleReadModelRepo;
import com.allen.study.domain.entity.SysRole;
import com.allen.study.domain.repository.ISysRoleRepo;
import com.allen.study.common.base.Pagination;
import com.allen.study.infrastructure.persistence.assembler.SysRolePOAssembler;
import com.allen.study.infrastructure.persistence.dao.ISysRoleMapper;
import com.allen.study.infrastructure.persistence.po.SysRolePO;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 角色表
 *
 * @author AllenSun
 * @since 2025-04-23 20:46
 */
@Service
@AllArgsConstructor
public class SysRoleRepoImpl extends ServiceImpl<ISysRoleMapper, SysRolePO>
        implements ISysRoleRepo, ISysRoleReadModelRepo {

    /**
     * 角色表持久化对象结构映射
     */
    private final SysRolePOAssembler sysRolePOAssembler;

    @Override
    public List<SysRoleQueryResponse> query(Pagination pagination, SysRoleQueryRequest queryRequest) {
        // 构造查询条件
        LambdaQueryWrapper<SysRolePO> lambdaQueryWrapper = Wrappers.lambdaQuery();


        // 如果 角色key 不为空
        if (ObjectUtils.isNotEmpty(queryRequest.getRoleKey())) {
            lambdaQueryWrapper.eq(SysRolePO::getRoleKey, queryRequest.getRoleKey());
        }
        // 如果 角色名称 不为空
        if (ObjectUtils.isNotEmpty(queryRequest.getRoleName())) {
            lambdaQueryWrapper.eq(SysRolePO::getRoleName, queryRequest.getRoleName());
        }

        // 默认按照主键倒序排序
        lambdaQueryWrapper.orderByDesc(SysRolePO::getId);

        // 分页查询
        Page<SysRolePO> page = super.page(Page.of(pagination.getPageNumber(), pagination.getPageSize()), lambdaQueryWrapper);
        pagination.setTotal(page.getTotal());
        // 角色表持久化对象 转 角色表查询响应对象
        return sysRolePOAssembler.toQueryResponse(page.getRecords());
    }

    @Override
    public SysRole queryById(String sysRoleId) {
        // 根据主键查询角色表
        SysRolePO sysRolePO = super.getById(sysRoleId);
        // 角色表持久化对象 转 角色表响应对象
        return sysRolePOAssembler.toEntity(sysRolePO);
    }

    @Override
    public void create(SysRole sysRole) {
        // 角色表实体转角色表持久化对象
        SysRolePO sysRolePO = sysRolePOAssembler.assembler(sysRole);

        // 创建角色表
        super.save(sysRolePO);
    }

    @Override
    public void deleteById(String sysRoleId) {
        // 物理删除角色表
        super.removeById(sysRoleId);
    }

    @Override
    public void updateById(SysRole sysRole) {
        // 角色表实体转角色表持久化对象
        SysRolePO sysRolePO = sysRolePOAssembler.assembler(sysRole);
        // 更新角色表
        super.updateById(sysRolePO);
    }
}
